// 3.编写一个复数类ComplexNumber，满足以下要求：
// （1）覆盖其Object.toString()方法，向外界返回“a+bi”形式的字串，此方法的声明为：public String toString() 
// （2）提供相应方法，完成复数的加法、取模运算。
// （3）覆盖Object.equals()方法，让两个复数对象可以确定是否相等。此方法的声明为：public boolean equals(Object obj) 
// （4）让你的ComplexNumber类实现Comparable接口，使得两个复数对象可以按照“模”来比较“谁大谁小”。
// （5）编写一个方法，此方法可以对一个ArrayList<ComplexNumber>集合进行排序。

import java.util.ArrayList;

//复数类
public class ComplexNumber {
    // 成员变量
    private double real_part; // 实部
    private double imaginary_part; // 虚部

    // 无参构造方法
    public ComplexNumber() {
        this.real_part = 0.0;
        this.imaginary_part = 0.0;
    }

    // 有参构造方法
    public ComplexNumber(double _real_part, double _imaginary_part) {
        this.real_part = _real_part;
        this.imaginary_part = _imaginary_part;
    }

    // 覆盖toString方法 返回a+bi形式字符串
    public String toString() {
        if (real_part == 0 && imaginary_part == 0) {
            return "0";
        }
        if (real_part == 0) {
            return String.valueOf(imaginary_part) + "i";
        }
        if (imaginary_part == 0) {
            return String.valueOf(real_part);
        }
        return String.valueOf(real_part) + "+" + String.valueOf(imaginary_part) + "i";
    }

    // 复数的加法运算
    public ComplexNumber Add(ComplexNumber next) {
        ComplexNumber tmp = new ComplexNumber(this.real_part + next.real_part,
                this.imaginary_part + next.imaginary_part);
        return tmp;
    }

    // 复数的取模运算
    public double mod() {
        return Math.sqrt(real_part * real_part + imaginary_part * imaginary_part);
    }

    // 覆盖Object.equals()方法
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        ComplexNumber tmp = (ComplexNumber) obj;
        return Double.compare(tmp.real_part, real_part) == 0 && Double.compare(tmp.imaginary_part, imaginary_part) == 0;
    }

    // 实现Comparable接口 按模比较
    public int Compareable(ComplexNumber tmp) {
        return Double.compare(this.mod(), tmp.mod());
    }

    // 对一个ArrayList<ComplexNumber>集合进行排序
    // 按模来排序
    public static void ArrayListSort(ArrayList<ComplexNumber> arr) {
        for (int i = 0; i < arr.size(); i++) {
            for (int j = 0; j < arr.size() - 1 - i; j++) {
                if (arr.get(j).mod() > arr.get(j + 1).mod()) {
                    ComplexNumber tmp = arr.get(j);
                    arr.set(j, arr.get(j + 1));
                    arr.set(j + 1, tmp);
                }
            }
        }
    }

    // main()方法里面进行测试
    public static void main(String[] args) {
        ComplexNumber c1 = new ComplexNumber(2.0, 3.0);
        ComplexNumber c2 = new ComplexNumber(1.0, 3.0);
        ComplexNumber c3 = new ComplexNumber(3.0, 4.0);

        // 先测试toString方法
        System.out.println(c1.toString());
        System.out.println(c2.toString());

        // 测试加法
        ComplexNumber ctmp = c1.Add(c2);
        System.out.println(ctmp.toString());

        // 测试取模
        System.out.println(c3.mod());

        // 测试equals方法
        ComplexNumber ctmp2 = new ComplexNumber(3.0, 4.0);
        boolean flag = c3.equals(ctmp2);
        System.out.println(flag);

        // 测试按模比较
        System.out.println(c1.Compareable(c3)); // c1小于c3

        // 测试排序 按模从小到大排序
        ArrayList<ComplexNumber> arr = new ArrayList<>();
        arr.add(c1);
        arr.add(c2);
        arr.add(c3);
        arr.add(ctmp2);

        System.out.println("排序前:" + arr);
        ArrayListSort(arr);
        System.out.println("排序后:" + arr);
    }

}